#!/usr/bin/env python3
#coding:utf-8

__author__ = 'xmxoxo<xmxoxo@qq.com>'

'''
人脸识别数据预处理程序

从目录名中提取人名；
从图像文件中提取人脸；
组合后保存到输出目录，用于人脸识别基础数据集；
'''

import json
import os
import re
import sys
import time
import requests
import argparse
from face_find import *
from faces_lib import *
from tqdm import tqdm

# 从目录名中提取人名；NER工作单独分出来
def get_ner_name(source_path, out_path):
    ret = []
    # 获取子目录名：
    subpaths = get_files(source_path, folder=1)

    print('正在提取子目录...')
    # 使用NER接口提取人名；
    for subpath in tqdm(subpaths, ncols=60) :
        # NER接口识别人名,多个人名用分隔符分开
        txt = (subpath[1] + ';').replace(' ', '')
        pers = get_ner(txt)
        if pers:
            pers = '#'.join(pers)
            ret.append('"%s"\t"%s"' % (subpath[0], pers))
            #print('%d person:%s' % (i, pers) )

    # 保存成文件
    outfile = os.path.join(out_path, 'folders.txt')
    savetofile('\n'.join(ret) + '\n', outfile)
    

# 创建人脸数据库
def creat_face(source_path, out_path):
    # 记录图片文件对应情况，用于后续的查询搜索；
    ret = []
    # 创建输出目录    
    mkfold(out_path)
    # 加载模型
    detector, predictor = load_model()

    i, t = 0, 0
    # 循环子目录
    for subpath in get_files(source_path, folder=1):
        print('subpath:', subpath[0])
        # NER接口识别人名,多个人名用分隔符分开
        txt = (subpath[1] + ';').replace(' ', '')
        pers = get_ner(txt)
        if pers:
            # 识别到人名后遍历图像文件
            pers = '#'.join(pers)
            print('%d person:%s' % (i, pers) )
            
            # 每个人名放一个目录下
            #image_out_path = os.path.join(out_path, pers + '/')
            '''
            # 已存在的目录跳过，避免多次生成
            if os.path.isdir(image_out_path): 
                pass
                #print('目录已存在，跳过...')
                #continue
            mkfold(image_out_path)
            '''

            j = 0
            for filename in get_files(subpath[0], folder=0):
                # print('filename:',filename)
                pic_prename = 'image_%03d_%03d'% (i,j)
                # 保存到统一目录： out_path 不使用中文目录; （中文目录： image_out_path)
                picname0 = os.path.join(out_path, pic_prename + '_0.png') 
                picname1 = os.path.join(out_path, pic_prename + '_1.png') 
                # 已存在的文件跳过；
                if os.path.isfile(picname0):
                    rec = '%s,%s,%s' % (filename[0], pers, picname0)
                    ret.append(rec)
                    if os.path.isfile(picname1):
                        rec = '%s\t%s\t%s' % (filename[0], pers, picname1)
                        ret.append(rec)
                    
                    j += 1
                    continue

                '''
                '''
                # 识别图像提取人脸并保存
                faces = face_detector(filename[0], detector, predictor, 
                                showwin=0, pre_name=pic_prename,
                                outpath=out_path)
                if len(faces)>0:
                    for n in range(len(faces)):
                        picname = os.path.join(out_path, pic_prename + '_%d.png' % n)
                        # 记录对应情况: 原始图路径，人名；保存图
                        rec = '%s,%s,%s' % (filename[0], pers, picname)
                        ret.append(rec)
                #faces = []
                j += 1
                t += len(faces) # 已保存图片总数
                if t>=10:
                    pass;
                    break;
            i += 1
        if t>=10:
            pass
            #print('result:\n%s'%('\n'.join(ret)))
            break;

    # 最后保存记录
    dat_file = os.path.join(out_path, 'image_list.csv')
    savetofile('\n'.join(ret) + '\n', dat_file, method='a+')

if __name__ == '__main__':

    source_path = r'Z:\downloadpic\download'
    out_path = './output/'

    get_ner_name(source_path, out_path)

    #creat_face(source_path, out_path)


